#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include<unistd.h>
#include <errno.h>


#define FILE_NAME "text"


// int main()
// {
//     FILE* pf=fopen("text","w");
//     if(pf==NULL)
//     {
//         perror("fopen\n");
//         return -1;
//     }

//     const char* msg="Hello csdn\n";
//     int cnt=5;
//     int sz;
//     while(cnt--)
//     {
//        fwrite(msg,strlen(msg),1,pf);
//     }

//     fclose(pf);
    
//     return 0;
// }

// struct S
// {
// 	char name[20];
// 	int age;
// 	float score;
// }a = { "张三",20,88.8f };

// int main()
// {
// 	//把a中的数据写到文件中
// 	FILE* fp = fopen("test.txt", "w");
// 	if (NULL == fp)
// 	{
// 		perror("fopen::test.txt");
// 		return 1;
// 	}
// 	//二进制的写文件
//     const char*msg="hello Linux\n";
//     int cnt=5;
//     while(cnt--)
//     {
//         fwrite(msg, strlen(msg), 1, fp);
//     }

// 	fclose(fp);
// 	fp = NULL;
// 	return 0;
// }

// int main()
// {
// 	FILE* fp = fopen("test.txt", "r");
// 	if (NULL == fp)
// 	{
// 		perror("fopen::test.txt");
// 		return 1;
// 	}
//     char buffer[5][64];//存放从文件中读取的内容。
//     int i=0;
//     while(1)
//     {
//         size_t rd = fread(buffer[i++], sizeof(buffer), 1, fp);//存放到二维数组中
//         if (rd<1)
//         {
//             break;
//         }
//     }
//     while(i--)
//     {
//         printf("%s",buffer[i]);//打印
//     }
   
// 	fclose(fp);
// 	fp = NULL;
// 	return 0;
// }

// int main()
// {
//     FILE* fp = fopen("myfile", "w");
//     if (!fp)
//     {
//         printf("fopen error!\n");
//     }
//     const char *msg = "hello bit!\n";
//     int count = 5;
//     while (count--)
//     {
//         fwrite(msg, strlen(msg), 1, fp);
//     }
//     fclose(fp);
//     return 0;
// }

// int main()
// {

//     FILE* pf=fopen(FILE_NAME,"r");
//     if(pf==NULL)
//     {
//         perror("fopen\n");
//         return -1;
//     }

//     char buffer[64];
//     int cnt=5;
//     while(cnt--)
//     {
//        fgets(buffer,sizeof(buffer),pf);
//        printf("%s",buffer);
//     }

//     fclose(pf);
    
//     return 0;
// }

// int main()
// {
//     FILE *file = fopen("text_file.txt", "w");
//     if (!file)
//     {
//         perror("Failed to open file");
//         return EXIT_FAILURE;
//     }

//     const char *text = "Hello, World!\n";
//     size_t written = fwrite(text, sizeof(char), strlen(text), file);

//     if (written != strlen(text))
//     {
//         perror("Failed to write text");
//     }
//     else
//     {
//         printf("Text written successfully\n");
//     }

//     fclose(file);
//     return EXIT_SUCCESS;
// }

// //向屏幕输出的方式：
// int main()
// {
//     const char* msg="hello world\n";
//     printf("%s",msg);//默认向stdout
//     fprintf(stdout,"%s",msg);//指定向stdout
//     fwrite(msg,strlen(msg),1,stdout);//指定向stdout
//     return 0;
// }

// int main()
// {
//     char buffer[64];

//     scanf("%s",buffer);
//     printf("%s\n",buffer);
//     getchar();
//     fgets(buffer,sizeof(buffer),stdin);
//     printf("%s\n",buffer);

//     return 0;
// }


//系统调用结果口

// int main()
// {
//     int fd=open("log.txt",O_CREAT|O_WRONLY|O_TRUNC,0666);
//     if(fd<0)
//     {
//         perror("open failed\n");
//         return -1;
//     }
//     close(fd);
//     return 0;
// }

// int main()
// {
//     //int fd=open("sys_text",O_CREAT|O_WRONLY);
//     int fd=open("sys_text",O_CREAT|O_WRONLY|O_TRUNC,0666);//第一次创建记得加上权限，注意umask
//     if(fd<0)
//     {
//         perror("open failed\n");
//         return -1;
//     }
//     const char*msg="hello wrold\n";
//     int cnt=5;
//     ssize_t sz;
//     while(cnt--)
//     {
//        sz= write(fd,msg,strlen(msg));
//     }
//     if(sz<0)
//     {
//         perror("write failed\n");
//         return -1;
//     }
//     close(fd);
//     return 0;
// }



// int main()
// {
//     //int fd=open("sys_text",O_CREAT|O_WRONLY);
//     int fd=open("sys_text",O_RDONLY);//第一次创建记得加上权限，注意umask
//     if(fd<0)
//     {
//         perror("open failed\n");
//         return -1;
//     }
//     char buffer [64];
    
//     while(1)
//     {
//        ssize_t sz= read(fd,buffer,sizeof(buffer));
//        if(sz>0)
//        {
//            printf("%s", buffer);
//        }
//        else if(sz==0)
//        {
//            break;
//        }
//        else
//        {
//            printf("errno:%d", errno);
//        }
//     }
//     close(fd);
//     return 0;
// }

// //fd本质
// int main()
// {
//     //0，1，2，一般指键盘，显示器，显示器
//     //in out err
//     char buf[64];
//     ssize_t s = read(0, buf, sizeof(buf));//从fd为0号下标开始读：键盘
//     if (s > 0)
//     {
//         buf[s] = 0;//转为字符串
//         write(1, buf, strlen(buf));//写入fd为1的文件：显示器
//         write(2, buf, strlen(buf));//写入fd为2的文件：显示器
//     }
//     return 0;
// }

// //文件描述符的分配规则
// int main()
// {
//     //默认会打开0 1 2三个流
//     close(0);//关闭0号文件
//     int fd=open("sys_text",O_RDONLY);
//     printf("fd:%d\n",fd);
//     //文件描述符的分配规则：在files_struct数组当中，找到当前没有被使用的最小的一个下标，作为新的文件描述符
//     close(fd);

//     return 0;
// }


//重定向

// int main()
// {
//     //理应显示到屏幕，但却输出到我们指定的文件中。
//     close(1);//out
//     int fd=open("sys_text",O_WRONLY|O_APPEND);
//     if(fd<0)
//     { 
//         perror("open failed\n");
//         return -1;
//     }
//     // printf("hello world\n");
//     // printf("hello linux\n");
//     // printf("hello csdn\n");
//     printf("APPEND\n");
//     //stdout->_fileno=2;//可以看出private的用处
//     //printf("stdout->_fileno:%d\n",stdout->_fileno);
//     fflush(stdout);//对于不同类型文件，刷新方式有所区别
//     close(fd);
//     return 0;
// }

// int main()
// {
//     //理应显示到屏幕，但却输出到我们指定的文件中。
//     //close(0);//in
//     int fd=open("sys_text",O_RDONLY);
//     if(fd<0)
//     { 
//         perror("open failed\n");
//         return -1;
//     }
//     stdin->_fileno=fd;
//     char str[40];
// 	while (scanf("%s", str) != EOF)
//     {
// 		printf("%s\n", str);
//     }

//     close(fd);
//     return 0;
// }



//使用dup2重定向
int main()
{
    int fd=open("sys_text",O_WRONLY|O_TRUNC);//清空再写
    if(fd<0)
    {
        perror("open failed\n");
        return -1;
    }
    dup2(fd,1);//old cover new ->
    printf("fd:%d\n",fd);
    printf("stdout->_fileno:%d\n",stdout->_fileno);
    printf("i hate u\n");
    printf("i love u\n");

    close(fd);
    return 0;
}



